#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <windows.h>
#include <GL/glut.h>
#include <math.h>
#endif

#include "CurvaBezier.h"
#include "Ponto.h"
#include "Auxiliar.h"

CurvaBezier::CurvaBezier(int grau)
{
    m_Grau = grau;
    m_Selected = false;
    //ctor
}

CurvaBezier::~CurvaBezier()
{
    //dtor
}

Ponto* CurvaBezier::avalia(float u, int indInicio, int indFinal)
{
    int i;
    float somatorioX = 0;
    float somatorioY = 0;
    for(i = indInicio; i <= indFinal; i++) {
        somatorioX += (m_Pontos[i]->GetPosX())*(Auxiliar::combinacao(m_Grau,i))*pow(u,i)*pow((1-u),(m_Grau-i));
        somatorioY += (m_Pontos[i]->GetPosY())*(Auxiliar::combinacao(m_Grau,i))*pow(u,i)*pow((1-u),(m_Grau-i));
    }
    return new Ponto(somatorioX, somatorioY);
}

void CurvaBezier::desenharCurva()
{
    int i;
    Ponto* pontoAnterior = avalia(0, 0, m_Grau);
    Ponto* pontoAtual;

    glColor3d(1,0,0);
    float u;
    for (i = 1; i <= 30; i++) {
        u = i/30.0f;
        pontoAtual = avalia(u, 0, m_Grau);
        glBegin(GL_LINES);
            glVertex2f(pontoAnterior->GetPosX(), pontoAnterior->GetPosY());
            glVertex2f(pontoAtual->GetPosX(), pontoAtual->GetPosY());
        glEnd();
        pontoAnterior = pontoAtual;
    }
}

void CurvaBezier::adPonto(float x, float y) {
    Ponto* p;
    p = new Ponto(x,y);
    m_Pontos.push_back(p);
}
